package com.shujia.network.tcp;

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

// 4. 从客户端发送文件给服务端，服务端保存到本地。并响应“上传成功”给客户端。并关闭相应的连接。
public class TcpTest5 {


    @Test
    public void client() throws IOException {
        // 指定ip地址和端口号
        Socket s = new Socket(InetAddress.getLocalHost(), 6666);

        // 读取文件到内存
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("file\\1.jpg"));

        // 图片的字节数据写入到Socket
        OutputStream os = s.getOutputStream();
        // 从server读取数据的流
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

        byte[] bys = new byte[1024];
        int len;
        // 本地文件读取完毕跳出循环
        while ((len = bis.read(bys)) != -1) {
            os.write(bys, 0, len);
        }

        // 关闭输出流, server就不会在阻塞等待读取数据
        s.shutdownOutput();

        // 显示服务端的响应数据
        String resp = br.readLine();
        System.out.println(resp);

        br.close();
        os.close();// 关闭输出流, 表示数据写入Socket完成
        bis.close();
        s.close();
    }


    // 客户端发送文件给服务端，服务端将文件保存在本地。
    @Test
    public void server() throws IOException {
        // 监听本机指定端口
        ServerSocket ss = new ServerSocket(6666);

        // 阻塞获取客户端的连接
        Socket s = ss.accept();

        // 读取文件到内存
        InputStream is = s.getInputStream();
        // 从Socket获取输出流, 写的是字符
        BufferedWriter br = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        OutputStream os = new FileOutputStream("file\\copy.jpg");

        byte[] bys = new byte[1024];
        int len;
        // server不会自己关闭, 需要client的通知
        // client写入完成, server不需要阻塞等待了,跳出循环
        while ((len = is.read(bys)) != -1) {
            os.write(bys, 0, len);
        }

        // 响应数据给client
        br.write("上传成功!");
        br.newLine();
        br.flush();

        // 关闭资源
        os.close();
        br.close();
        is.close();
        s.close();
        ss.close();


    }
}
